                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           package org.aerie.forest.core.frame.rebar.entity.tool;

import java.io.InputStream;
import java.util.Hashtable;
import java.util.Map;
import java.util.Optional;

import org.aerie.forest.core.brick.exception.ExceptionPack;
import org.aerie.forest.core.brick.exception.custom.ForestException;
import org.yaml.snakeyaml.Yaml;

/**
 * @description forest核心文件工具类
 *
 * @author quark
 * @organization aerie
 * @date 2020年2月28日 下午12:43:12
 * @version 1.2.0
 */
public final class CoreFileTool extends ForestTool {

	/**
	 * @description forest静态内部类单例
	 *
	 * @author quark
	 * @organization aerie
	 * @date 2020-7-9 20:30:37
	 * @version 2.0.1
	 */
	private static final class ForestInstance {

		/**
		 * @description 单例对象
		 * 
		 * @author quark
		 * @date 2020-7-9 21:16:25
		 * @version 2.0.1
		 */
		private static final CoreFileTool CORE_FILE_TOOL = new CoreFileTool();
	}

	/**
	 * Construction
	 * 
	 *
	 * @author quark
	 * @date 2020年6月10日 下午6:42:37
	 * @version 1.2.2
	 */
	private CoreFileTool() {
		super("核心文件工具");
	}

	/**
	 * @description 获得单例forest核心文件工具
	 * @return forest核心文件工具类
	 *
	 * @author quark
	 * @date 2020年6月10日 下午6:54:44
	 * @version 1.2.2
	 */
	static final CoreFileTool getInstance() {
		return ForestInstance.CORE_FILE_TOOL;
	}

	/**
	 * @description yaml文件的解析
	 * @param inputStream yaml文件流
	 * @param zClass      准备解析成的类
	 * @return 解析成的对象
	 * @throws Exception 解析异常
	 *
	 * @author quark
	 * @date 2020年6月10日 下午6:56:09
	 * @version 1.2.2
	 */
	public <T> T analyzeYamlByClass(InputStream inputStream, Class<T> zClass) throws Exception {
		try {
			return new Yaml()
					.loadAs(Optional.ofNullable(inputStream).orElseThrow(() -> new ForestException("yaml文件流为空") {

						/**
						 * @description 序列化编号
						 * 
						 * @author quark
						 * @date 2020年6月11日 下午3:41:50
						 * @version 1.2.2
						 */
						private static final long serialVersionUID = 1L;
					}), zClass);
		} catch (Exception e) {
			throw new ExceptionPack("yaml文件的解析失败", e);
		}
	}

	/**
	 * @description 将yaml文件的解析成map
	 * @param inputStream yaml文件流
	 * @return 解析成的map
	 * @throws Exception 解析异常
	 *
	 * @author quark
	 * @date 2020年6月10日 下午7:00:41
	 * @version 1.2.2
	 */
	public Map<?, ?> analyzeYamlToMap(InputStream inputStream) throws Exception {
		return analyzeYamlByClass(inputStream, Map.class);
	}

	/**
	 * @description 将yaml文件的解析成Hashtable
	 * @param inputStream yaml文件流
	 * @return 解析成的Hashtable
	 * @throws Exception 解析异常
	 *
	 * @author quark
	 * @date 2020年6月10日 下午7:04:41
	 * @version 1.2.2
	 */
	public Hashtable<?, ?> analyzeYamlToHashtable(InputStream inputStream) throws Exception {
		return analyzeYamlByClass(inputStream, Hashtable.class);
	}

}
